#pragma once


namespace jxh {
	template<class T>
	class set {
		typedef RBTreeNode<T> Node;
		struct keyofvalue {
			const T& operator()(const T&key) {
				return key;
			}
		};
		void _inorder(Node* root) {
			if (root == nullptr)return;
			_inorder(root->_left);
			cout << root->_data << endl;
			_inorder(root->_right);
		}
	public:
		typedef typename RBTree<T, const T, keyofvalue>::iterator iterator;
		typedef typename RBTree<T, const T, keyofvalue>::const_iterator const_iterator;
		iterator begin()
		{
			return _t.begin();
		}

		iterator end()
		{
			return _t.end();
		}
		const_iterator begin()const
		{
			return _t.begin();
		}

		const_iterator end()const
		{
			return _t.end();
		}

		pair<iterator, bool> insert(const T& key)
		{
			return _t.insert(key);
		}

		iterator find(const T& key)
		{
			return _t.find(key);
		}

		void inorder() {
			_inorder(_t.getroot());
		}
	private:
		RBTree<T,const T,keyofvalue> _t;
	};
	//template<class K>
	//class set
	//{
	//	struct SetKeyOfT
	//	{
	//		const K& operator()(const K& key)
	//		{
	//			return key;
	//		}
	//	};
	//public:
	//	typedef typename RBTree<K, const K, SetKeyOfT>::iterator iterator;
	//	typedef typename RBTree<K, const K, SetKeyOfT>::const_iterator const_iterator;

	//	iterator begin()
	//	{
	//		return _t.begin();
	//	}

	//	iterator end()
	//	{
	//		return _t.end();
	//	}

	//	pair<iterator, bool> insert(const K& key)
	//	{
	//		return _t.Insert(key);
	//	}

	//	iterator find(const K& key)
	//	{
	//		return _t.Find(key);
	//	}

	//private:
	//	RBTree<K, const K, SetKeyOfT> _t;
	//};

	//void test_set1()
	//{
	//	set<int> s;
	//	int a[] = { 4, 2, 6, 1, 3, 5, 15, 7, 16, 14 };
	//	for (auto e : a)
	//	{
	//		s.insert(e);
	//	}

	//	set<int>::iterator it = s.begin();
	//	while (it != s.end())
	//	{
	//		//if(*it % 2 == 0)
	//		//	*it += 100;

	//		cout << *it << " ";
	//		++it;
	//	}
	//	cout << endl;
	//}
}